﻿Imports System.Text.RegularExpressions

Public Enum EnumBarcodeType
    NONE
    RESET_CODE
    IRREGULAR_CODE
    SHIPORDER_CODE
    ORDER_CODE
    INNER_LABEL_CODE
    OUTER_LABEL_CODE_I
    OUTER_LABEL_CODE_D
    OUTER_LABEL_CODE_M
    END_LABEL_CODE
    ME_CLOSED_CODE
    EMP_CODE
    INNER_DELIVERY
    GROUP_REPORT_CODE
End Enum

Public Class CBarcode

    Public Shared ReadOnly Property RESETCODE() As String
        Get
            Return CCommon.CNS_RESET1
        End Get
    End Property

    Public Shared Function GetBarcodeType(ByVal barcode As String) As EnumBarcodeType
        Dim checkText As String = barcode
        'If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_FRACTION) Then
        '    checkText = checkText.Substring(0, checkText.Length - 1)
        'End If

        '***************************
        '* リセットコードチェック
        '***************************
        If CCommon.isInStr(checkText, CCommon.CNS_RESET1) Then
            Return EnumBarcodeType.RESET_CODE
        End If

        '***************************
        '* 各種コードチェック
        '***************************
        'If CCommon.isInStr(checkText, CCommon.CNS_RESET2, CCommon.CNS_RESET3, CCommon.CNS_RESET4) Then
        '    Return EnumBarcodeType.IRREGULAR_CODE
        'End If
        If CCommon.isInStr(checkText, CCommon.CNS_RESET3, CCommon.CNS_RESET4) Then
            Return EnumBarcodeType.IRREGULAR_CODE
        End If

        '***************************
        '* ラベル読取終了コードチェック
        '***************************
        Select Case checkText
            Case CCommon.CNS_END_LABEL
                Return EnumBarcodeType.END_LABEL_CODE
        End Select

        '***************************
        '* 強制終了コードチェック
        '***************************
        Select Case checkText
            Case CCommon.CNS_END
                Return EnumBarcodeType.ME_CLOSED_CODE
        End Select

        '***************************
        '* 統括レポートコードチェック
        '***************************
        If checkText.EndsWith("##") Then
            If checkText.StartsWith("##") Then
                Return EnumBarcodeType.GROUP_REPORT_CODE
            End If
        End If

        '***************************
        '* 出荷指示番号チェック
        '***************************
        If checkText.Length = 22 Then
            If checkText.Substring(0, 2) = CCommon.CNS_DELIMITER_SHIPORDER1 Then
                If checkText.IndexOf(CCommon.CNS_DELIMITER_SHIPORDER2) = 13 Then
                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_ROW_CD), "[0-9A-Z]{2}") Then
                        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_ORDER_CNT), "[0-9A-Z]{1}") Then
                            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_STRAT_NO), "[0-9A-Z]{2}") Then
                                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_PAGE_NO), "[0-9A-Z]{2}") Then
                                    Return EnumBarcodeType.SHIPORDER_CODE
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If

        '***************************
        '* 社内納品書チェック
        '***************************
        If checkText.Length = 19 Then
            If checkText.StartsWith("#**") Then
                If checkText.EndsWith("**#") Then
                    If checkText.IndexOf(CCommon.CNS_DELIMITER_SHIPORDER2) = 14 Then
                        Return EnumBarcodeType.INNER_DELIVERY
                    End If
                End If
            End If
        End If

        '***************************
        '* 注文番号チェック
        '***************************
        If checkText.Length > 10 Then
            'Dim data As String = barcode.Substring(barcode.Length - 10, 10)
            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ORDER_QTY), "[0-9a-zA-Z]{3}") Then ''注文数量 62進数
                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ITEM_KEY), "[0-9A-Z]{3}") Then ''品番キー 36進数
                    'Dim itemDAO As ItemDao
                    'itemDAO.check(data.Substring(3, 3))
                    'If itemDAO.getItemCd <> "" Then
                    If CCommon.isInStr(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_LABEL_TYPE), "I", "N", "M", "E", "D") Then ''ラベルタイプ
                        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ROW_CD), "[A-Z]{1}") Then ''RowNumのハイフン前 A-Z
                            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ROW_NO), "[0-9A-Z]{2}") Then ''RowNumのハイフン後 36進数
                                Return EnumBarcodeType.ORDER_CODE
                            End If
                        End If
                    End If
                    'End If
                End If
            End If
        End If

        '***************************
        '* 社内ラベルチェック
        '***************************
        'NNNNNNNNNNNN@UUUUXX
        'NNNNNNNNNNNN@UUUU**
        If checkText.Length > 7 Then
            If checkText.IndexOf(CCommon.CNS_DELIMITER_LABEL_INNER) = checkText.Length - 7 Then
                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_IN_UNIQUE_CD), "[0-9A-Z]{4}") Then
                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_IN_QTY), "[0-9A-Z]{2}") Or CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_IN_QTY) = "**" Then
                        Return EnumBarcodeType.INNER_LABEL_CODE
                    End If
                End If
            End If
        End If

        '***************************
        '* INOACラベルチェック
        '***************************
        'NNNNNNNNNNNN*UUUU
        If checkText.Length > 7 Then
            If checkText.IndexOf(CCommon.CNS_DELIMITER_LABEL_INOAC) = checkText.Length - 7 Then
                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_I_UNIQUE_CD), "[0-9A-Z]{4}") Then
                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_I_QTY), "[0-9A-Z]{2}") Then
                        Return EnumBarcodeType.OUTER_LABEL_CODE_I
                    End If
                End If
            End If
        End If

        '***************************
        '* ダイキョーラベルチェック
        '***************************
        '@XXXXXXXXXNNNMMMD
        If checkText.Length > 8 Then
            If checkText.StartsWith(CCommon.CNS_DELIMITER_LABEL_DNC1) Then
                If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_DNC2) Or checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_DNC3) Then
                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_D_ORDER_QTY), "[0-9A-Z]{3}") Then
                        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_D_ITEM_KEY), "[0-9A-Z]{3}") Then
                            Return EnumBarcodeType.OUTER_LABEL_CODE_D
                        End If
                    End If
                End If
            End If
        End If

        '***************************
        '* マツダラベルチェック
        '***************************
        '*KCCCCCNNNNNNNNNNNN00000000Z*
        If checkText.Length > 2 Then
            If checkText.StartsWith(CCommon.CNS_DELIMITER_LABEL_MAZDA1) Then
                If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_MAZDA2) Then
                    If CCommon.isInStr(checkText.Substring(1, 1), "A", "B") Then
                        Return EnumBarcodeType.OUTER_LABEL_CODE_M
                    End If
                End If
            End If
        End If

        '***************************
        '* 従業員コードチェック
        '***************************
        ''DB参照
        Dim empDAO As CEmpDAO = CEmpDAO.GetInstance()
        Dim empData As strctEmpInfo = empDAO.GetEmpInfo(checkText)
        If empData.EmpCd <> "" Then
            Return EnumBarcodeType.EMP_CODE
        End If

        '***************************
        '* どれにもヒットしなかった場合
        '***************************
        Return EnumBarcodeType.NONE


    End Function


End Class
